package com.example.kotlin

import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowForward
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.kotlin.ui.theme.KotlintestTheme

/**
 * MainActivity - 应用程序主入口，作为练习项目菜单
 *
 * 这是应用的首页，展示所有练习项目的列表
 * 用户可以点击列表项进入不同的练习项目
 *
 * 关键知识点：
 * 1. ComponentActivity - Android Jetpack Compose 的基础Activity类
 * 2. Intent - Android组件间通信的核心机制
 * 3. LazyColumn - Compose中的懒加载列表组件（类似RecyclerView）
 */
class MainActivity : ComponentActivity() {

    /**
     * onCreate - Activity生命周期方法，在Activity创建时调用
     *
     * @param savedInstanceState 保存的实例状态，用于恢复Activity状态
     *
     * 注意事项：
     * - 这是Activity的入口点，只会在Activity首次创建时调用一次
     * - 所有的初始化工作应该在这里完成
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // enableEdgeToEdge() - 启用全屏显示，内容可以延伸到系统栏后面
        // 这样可以获得更现代的沉浸式体验
        enableEdgeToEdge()

        // setContent - 设置Compose UI内容
        // 这是Jetpack Compose的入口点，用声明式UI替代传统的XML布局
        setContent {
            // KotlintestTheme - 应用主题包装器
            // 定义了应用的颜色、字体、形状等设计系统
            KotlintestTheme {
                // Scaffold - Material Design 3的脚手架组件
                // 提供了基本的Material Design布局结构（顶栏、底栏、浮动按钮等）
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    // 显示项目菜单列表
                    ProjectMenuScreen(modifier = Modifier.padding(innerPadding))
                }
            }
        }
    }
}

/**
 * 练习项目数据类
 *
 * data class - Kotlin的数据类，自动生成equals、hashCode、toString等方法
 *
 * @param title 项目标题
 * @param description 项目描述
 * @param activityClass 对应的Activity类，使用Class<*>表示任意类型的Class对象
 */
data class ProjectItem(
    val title: String,
    val description: String,
    val activityClass: Class<*>
)

/**
 * ProjectMenuScreen - 项目菜单屏幕组件
 *
 * @Composable - 标记这是一个可组合函数（Compose UI组件）
 *
 * @param modifier 修饰符，用于调整组件的布局和外观
 *
 * 关键知识点：
 * - Composable函数是Compose UI的基本单元
 * - 函数名通常使用PascalCase（首字母大写）
 * - modifier参数是Compose的标准做法，允许外部调整组件样式
 */
@Composable
fun ProjectMenuScreen(modifier: Modifier = Modifier) {
    // LocalContext.current - 获取当前的Android Context
    // 这是Compose中访问Android系统服务的标准方式
    val context = LocalContext.current

    /**
     * 练习项目列表
     *
     * listOf - 创建不可变列表
     *
     * 注意事项：
     * - 这里使用listOf创建的是只读列表，无法添加或删除元素
     * - 如果需要可变列表，使用mutableListOf
     * - 新增项目时，只需在这个列表中添加新的ProjectItem即可
     */
    val projects = listOf(
        ProjectItem(
            title = "1. 计算器",
            description = "基础计算器应用，支持加减乘除运算",
            activityClass = CalculatorActivity::class.java
        )
        // 未来可以在这里添加更多练习项目，例如：
        // ProjectItem("2. 待办事项", "待办事项管理应用", TodoActivity::class.java),
        // ProjectItem("3. 天气查询", "天气信息查询应用", WeatherActivity::class.java)
    )

    /**
     * Column - 垂直布局容器
     * 子元素会从上到下排列
     *
     * modifier参数说明：
     * - fillMaxSize() - 填充父容器的全部空间
     * - padding(16.dp) - 设置内边距为16dp（密度无关像素）
     */
    Column(
        modifier = modifier
            .fillMaxSize()
            .padding(16.dp)
    ) {
        /**
         * 标题文本
         *
         * Text组件的关键属性：
         * - text - 显示的文本内容
         * - fontSize - 字体大小（sp：可缩放像素，会根据用户字体设置自动调整）
         * - fontWeight - 字体粗细
         */
        Text(
            text = "Kotlin 练习项目",
            fontSize = 28.sp,
            fontWeight = FontWeight.Bold,
            modifier = Modifier.padding(bottom = 8.dp)
        )

        // 副标题
        Text(
            text = "选择一个项目开始学习",
            fontSize = 16.sp,
            color = MaterialTheme.colorScheme.onSurfaceVariant,
            modifier = Modifier.padding(bottom = 24.dp)
        )

        /**
         * LazyColumn - 懒加载列表
         *
         * 关键特性：
         * - 只渲染可见的列表项，提高性能（类似RecyclerView）
         * - 自动处理滚动
         * - 适合显示大量数据
         *
         * verticalArrangement - 设置子元素的垂直排列方式
         * spacedBy(12.dp) - 每个列表项之间间隔12dp
         */
        LazyColumn(
            verticalArrangement = Arrangement.spacedBy(12.dp)
        ) {
            /**
             * items - LazyColumn的列表项构建器
             *
             * @param items 数据源列表
             * @param itemContent lambda表达式，定义每个列表项的UI
             *
             * 注意：这里的 project -> { } 是lambda表达式的简写
             */
            items(projects) { project ->
                // 为每个项目创建一个卡片
                ProjectCard(
                    project = project,
                    onClick = {
                        /**
                         * Intent - Android的意图对象，用于启动组件
                         *
                         * Intent(context, activityClass)构造函数：
                         * - context: 当前上下文
                         * - activityClass: 要启动的Activity的Class对象
                         *
                         * startActivity - 启动新的Activity
                         *
                         * 注意事项：
                         * - 确保目标Activity已在AndroidManifest.xml中注册
                         * - Intent是Android四大组件通信的核心机制
                         */
                        val intent = Intent(context, project.activityClass)
                        context.startActivity(intent)
                    }
                )
            }
        }
    }
}

/**
 * ProjectCard - 项目卡片组件
 *
 * 展示单个练习项目的卡片UI
 *
 * @param project 项目数据
 * @param onClick 点击事件回调
 *
 * 关键知识点：
 * - 组件复用：将重复的UI逻辑提取为独立组件
 * - 回调函数：通过lambda参数传递事件处理逻辑
 */
@Composable
fun ProjectCard(
    project: ProjectItem,
    onClick: () -> Unit
) {
    /**
     * Card - Material Design 3的卡片组件
     *
     * 卡片特性：
     * - 自带阴影和圆角
     * - 符合Material Design设计规范
     * - 可以设置颜色、边框等样式
     *
     * modifier.clickable - 添加点击效果
     * - 自动添加涟漪动画（ripple effect）
     * - 处理点击事件
     */
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .clickable { onClick() },
        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
    ) {
        /**
         * Row - 水平布局容器
         * 子元素从左到右排列
         *
         * modifier属性：
         * - fillMaxWidth() - 填充卡片的宽度
         * - padding(16.dp) - 设置内边距
         *
         * verticalAlignment - 垂直对齐方式
         * CenterVertically - 垂直居中对齐
         */
        Row(
            modifier = Modifier
                .fillMaxWidth()
                .padding(16.dp),
            verticalAlignment = Alignment.CenterVertically
        ) {
            /**
             * Column - 包含标题和描述的垂直布局
             *
             * weight(1f) - 权重修饰符
             * - 占据Row中剩余的所有空间
             * - 1f表示权重为1（浮点数）
             * - 类似于LinearLayout的layout_weight
             */
            Column(modifier = Modifier.weight(1f)) {
                // 项目标题
                Text(
                    text = project.title,
                    fontSize = 18.sp,
                    fontWeight = FontWeight.SemiBold
                )

                Spacer(modifier = Modifier.height(4.dp))

                // 项目描述
                Text(
                    text = project.description,
                    fontSize = 14.sp,
                    color = MaterialTheme.colorScheme.onSurfaceVariant
                )
            }

            /**
             * Icon - 图标组件
             *
             * Icons.Filled.ArrowForward - Material Design图标
             * - Filled表示填充样式
             * - ArrowForward是向右的箭头图标
             *
             * contentDescription - 无障碍描述
             * - 用于屏幕阅读器
             * - 提高应用的可访问性
             *
             * tint - 图标颜色
             */
            Icon(
                imageVector = Icons.Filled.ArrowForward,
                contentDescription = "进入项目",
                tint = MaterialTheme.colorScheme.primary
            )
        }
    }
}

/**
 * @Preview - 预览注解
 *
 * 用途：
 * - 在Android Studio中显示组件预览
 * - 无需运行应用即可查看UI效果
 * - 支持多种预览配置（暗色主题、不同屏幕尺寸等）
 *
 * showBackground = true - 显示背景色
 */
@Preview(showBackground = true)
@Composable
fun ProjectMenuScreenPreview() {
    KotlintestTheme {
        ProjectMenuScreen()
    }
}